from PIL import Image
import numpy as np
import cv2


# 图像通道分离
def image_split():
    image = cv2.imread('image.jpg')
    B, G, R = cv2.split(image)
    cv2.imshow('RED', R)
    cv2.imshow('GREEN', G)
    cv2.imshow('BLUE', B)
    cv2.waitKey(0)

# 为什么得到的是三张不同d灰度图呢？不是已经分离出R，G，B通道了吗？应该是分别是红色图，绿色图，蓝色图才对阿。
# 原因是：当调用 imshow（R）时，是把图像的R，G，B三个通道的值都变为R的值，所以图像的颜色三通道值为（R，R，R）
# 同理 imshow（G）和imshow（B）所显示d图像的颜色通道也依次为（G，G，G）和（B，B，B）。而当三个通道d值相同时，则为灰度图。


# 图像通道合并
# 使用merge（）函数将某一颜色通道（如R）与零矩阵合并，形成（R，0，0）从而显示只有红色通道的图
def image_merge():
    image = cv2.imread("image.jpg")  # 读取要处理的图片
    B, G, R = cv2.split(image)  # 分离出图片的B，R，G颜色通道
    zeros = np.zeros(image.shape[:2], dtype="uint8")  # 创建与image相同大小的零矩阵
    cv2.imshow("BLUE", cv2.merge([B, zeros, zeros]))  # 显示 （B，0，0）图像
    cv2.imshow("GREEN", cv2.merge([zeros, G, zeros]))  # 显示（0，G，0）图像
    cv2.imshow("RED", cv2.merge([zeros, zeros, R]))  # 显示（0，0，R）图像

    # 合并为原图
    cv2.imshow('MERGE', cv2.merge([B, G, R]))
    # cv2.imshow('MERGE1', cv2.merge([B, R, G]))
    # cv2.imshow('MERGE2', cv2.merge([G, R, B]))
    # cv2.imshow('MERGE3', cv2.merge([G, B, R]))
    # cv2.imshow('MERGE4', cv2.merge([R, G, B]))
    # cv2.imshow('MERGE5', cv2.merge([R, B, G]))
    cv2.waitKey(0)


# 将彩色图片分开成单个通道再合并
def split_channel():
    image = Image.open('image.jpg')
    # image.show()
    # 分离成单个通道
    r, g, b = image.split()
    # r.show()
    # g.show()
    # b.show()
    # 合并成一张新的图片
    image = Image.merge('RGB', (r, g, b))
    image.show()


if __name__ == '__main__':
    image_split()
    image_merge()
    split_channel()
